Meno prvku vymenovaneho typu
Otázka od: Jan Kostial
14. 10. 2004 11:13
Zdravim,
poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?
Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );
Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.
Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'
funkcia GetEnumName() zda sa funguje len na triedy...
Dik.
Lucky.
Odpovedá: Petr Brant
14. 10. 2004 11:32
Tohle IMHO nejde, ten nazev je jen mnemotechnicky a v dobe behu programu je
nahrazen cislem. Jedinou cestu vidim v tom, ze si zavedes konstantu
CMyType: array[TMyType] of string = ( 'prvy_clen', 'druhy_clen',
'treti_clen' );
a pak se budes odkazovat na CMyType[ordinalni_cislo_prvku]
Zdravim
RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz
poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?
Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );
Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.
Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'
Odpovedá: Petr Vones
14. 10. 2004 12:34
From: "Jan Kostial" <lucky62@szm.sk>
> poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> za behu programu?
uses
TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
A: TAlignment;
begin
A := taCenter;
S := GetEnumName(TypeInfo(TAlignment), Integer(A));
ShowMessage(S);
end;
Petr Vones
Odpovedá: tondrej@t-online.de
14. 10. 2004 14:07
> poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> za behu programu?
>
> Mam napr. takyto typ:
> TMyType = ( prvy_clen, druhy_clen, treti_clen );
>
> Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
> vratila dane meno prislusneho prvku.
Da sa to pomocou RTTI, v unite TypInfo je funkcia GetEnumName:
uses TypInfo;
var
M: TMyType;
begin
for M := Low(TMyType) to High(TMyType) do
ShowMessage(GetEnumName(TypeInfo(TMyType), Ord(M)));
end;
HTH
TOndrej
Odpovedá: Jiri Bouchala
14. 10. 2004 14:06
Vse lze ziskat z RTTI za behu asi takto:
uses TypInfo;
type TMyType = ( prvy_clen, druhy_clen, treti_clen );
var OrdTypeInfo:PTypeInfo;
EnumName:string;
begin
OrdTypeInfo:=TypeInfo(TMyType);
EnumName:=GetEnumName(OrdTypeInfo, 1); //viz priklad 'druhy_clen'
end;
JB
poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
za behu programu?
Mam napr. takyto typ:
TMyType = ( prvy_clen, druhy_clen, treti_clen );
Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
vratila dane meno prislusneho prvku.
Napr:
MenoPrvku := ReverseOrd( TMyType, 1 ); //vratilo by retazec 'druhy_clen'
funkcia GetEnumName() zda sa funguje len na triedy...
Odpovedá: Jan Kostial
14. 10. 2004 14:40
GetEnumName by bolo perfektne,
bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
Type TMyType has no type info.
Nepomohol ani prepinac {$M+}
> > poradi niekto, ako sa da zistit meno prvku vymenovaneho typu
> > za behu programu?
> >
> > Mam napr. takyto typ:
> > TMyType = ( prvy_clen, druhy_clen, treti_clen );
> >
> > Potreboval by som funkciu, ktora by mi na zaklade ordinalnej hodnoty
> > vratila dane meno prislusneho prvku.
>
> Da sa to pomocou RTTI, v unite TypInfo je funkcia GetEnumName:
>
> uses TypInfo;
>
> var
> M: TMyType;
> begin
> for M := Low(TMyType) to High(TMyType) do
> ShowMessage(GetEnumName(TypeInfo(TMyType), Ord(M)));
> end;
>
> HTH
> TOndrej
>
>
>
>
Odpovedá: Ondrej Kelle
14. 10. 2004 14:50
> GetEnumName by bolo perfektne,
> bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
>
> Type TMyType has no type info.
> Nepomohol ani prepinac {$M+}
Zaujimave, o ktoru verziu Delphi sa jedna? V D7 to funguje bez akychkolvek
prepinacov.
V kazdom pripade, mozes kompilator Delphi prinutit, aby pre ten typ
vygeneroval RTTI tym, ze si nadeklarujes published property v pomocnej
triede:
type
TDummy = class(TPersistent)
private
FDummy: TMyType;
published
property Dummy: TMyType read FMyType write FMyType;
end;
Neskusal som to, ale snad to pomoze. Inak si asi budes musiet nadefinovat to
pole stringovych konstant, ako tu uz bolo spominane.
HTH
TOndrej
Odpovedá: Jan Kostial
14. 10. 2004 15:10
Mam D7. ???
Niekde na nete som cital, ze TypeInfo nefunguje na zaznamy (record).
Skusal to niekto na vlastnom vymenovanom type?
Lucky
> > GetEnumName by bolo perfektne,
> > bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
> >
> > Type TMyType has no type info.
> > Nepomohol ani prepinac {$M+}
>
> Zaujimave, o ktoru verziu Delphi sa jedna? V D7 to funguje bez akychkolvek
> prepinacov.
>
> V kazdom pripade, mozes kompilator Delphi prinutit, aby pre ten typ
> vygeneroval RTTI tym, ze si nadeklarujes published property v pomocnej
> triede:
>
> type
> TDummy = class(TPersistent)
> private
> FDummy: TMyType;
> published
> property Dummy: TMyType read FMyType write FMyType;
> end;
>
> Neskusal som to, ale snad to pomoze. Inak si asi budes musiet nadefinovat
to
> pole stringovych konstant, ako tu uz bolo spominane.
>
> HTH
> TOndrej
Odpovedá: Ondrej Kelle
14. 10. 2004 15:24
> Mam D7. ???
> Niekde na nete som cital, ze TypeInfo nefunguje na zaznamy (record).
> Skusal to niekto na vlastnom vymenovanom type?
Ten kod, co som poslal, tu u mna funguje. TMyType som pouzil z Tvojho
prispevku, bez zmeny. S record type to nema nic spolocne, je to enumerated
type.
HTH
TOndrej
Odpovedá: Karel Kral
18. 10. 2004 7:47
TypeInfo funguje pouze na properties, ke kterym existuje RTTI informace.
To jsou property uvedene v sekci published.
Jan Kostial napsal(a):
> GetEnumName by bolo perfektne,
> bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
>
> Type TMyType has no type info.
> Nepomohol ani prepinac {$M+}
>
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________
Odpovedá: Jan Kostial
18. 10. 2004 9:11
Moj typ TMyType ale nie je property ziadnej triedy.
Je to proste typ. Pomohlo by definovat ho vo vhodnej sekcii nejakej unit?
Lucky
> TypeInfo funguje pouze na properties, ke kterym existuje RTTI informace.
> To jsou property uvedene v sekci published.
>
> Jan Kostial napsal(a):
> > GetEnumName by bolo perfektne,
> > bohuzial funkcia TypeInfo(TMyType) mi napise chybu:
> >
> > Type TMyType has no type info.
> > Nepomohol ani prepinac {$M+}
> >
> ______________________________________________________
> Karel Kral, vedouci odd. IT / IT manager
> Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
> Tel: 547 235 000, 602 552 432, Fax: 547 231 203
> E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
> ______________________________________________________
>
>
>
>